package com.bbva.kyfb.kyfbdto.abstracts;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.bbva.jee.arq.spring.core.contexto.ArqSpringContext;
import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.jee.arq.spring.core.util.excepciones.PropiedadNoEncontradaExcepcion;
import com.bbva.kyfb.kyfbdaofo.interfaces.SfoDao;
import com.bbva.kyfb.kyfbdto.firmas.errores.Errores_kyfb_servicios;
import com.bbva.kyfb.kyfbdtofo.entitys.SfoDTO;
import com.bbva.kyfb.kyfbdtofo.firmas.errores.Errores_kyfbfo_servicios;
import com.bbva.kyfb.kyfbjpatlbh.dominiotlbh.Ttlsbsfo;
import com.bbva.kyfb.kyfbjpatlbh.dominiotlbh.TtlsbsfoPK;

@SuppressWarnings("unchecked")
public abstract class SfoDaoAbstract extends
		DaoAbstract<Ttlsbsfo, TtlsbsfoPK> implements SfoDao {
	
	@Override
	@PersistenceContext(unitName = "persistenceUnitTLBH")
	protected void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	private static final Logger logger = LoggerFactory
			.getLogger(SfoDaoAbstract.class);

	public SfoDaoAbstract() {
		super(Ttlsbsfo.class);
	}

	@Override
	public List<Object[]> getEstados(String claseOrden, String numItem) {
		try {
			String queryEstados = ArqSpringContext
					.getPropiedad("TLSB.TTLSBSFO.ESTADOS");
			Query query = entityManager.createNativeQuery(queryEstados);
			query.setParameter("COD_CLASEORD", claseOrden);
			query.setParameter("QNU_NUMITEM", numItem);

			List<Object[]> resultList = query.getResultList();

			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
	}

	@Override
	public List<Object[]> getDetalleFichero(String numItem, String timeStamp) {

		try {
			String queryDetalleFichero = ArqSpringContext
					.getPropiedad("TLSB.TTLSBSFO.TTLSBCAB.NOMASUNTO");
			Query query = entityManager.createNativeQuery(queryDetalleFichero);

			query.setParameter("QNU_NUMITEM", numItem);
			query.setParameter("TIM_FICHERO", timeStamp);

			List<Object[]> resultList = query.getResultList();

			if (resultList.size() > 0) {
				return resultList;
			} else {
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}

	}

	@Override
	public List<SfoDTO> selectSFOandCAFfromSFOandCABbySFOpk(
			TtlsbsfoPK aTtlsbsfoPK) {
		try {
			String jpaqlString = ArqSpringContext
					.getPropiedad("TLSB.TTLSBSFO.SELECT_SFO_CAB_FROM_TSFO_AND_CAB_BY_SFO_PK");

			logger.info(jpaqlString);

			Query query = entityManager.createQuery(jpaqlString);
			query.setParameter("QNU_NUMITEM", aTtlsbsfoPK.getQnuNumitem());
			query.setParameter("COD_IDORDEN", aTtlsbsfoPK.getCodIdorden());
			query.setParameter("COD_CLASEORD", aTtlsbsfoPK.getCodClaseord());
			query.setParameter("COD_CLIECASH", aTtlsbsfoPK.getCodCliecash());

			List<SfoDTO> ttlsbsfoDTOList = query.getResultList();

			return ttlsbsfoDTOList;

		} catch (PropiedadNoEncontradaExcepcion e) {
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfbfo_servicios.ERROR_EN_SQL);
		}
	}
}